package logica.DAO;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import objetosNegocio.Cliente;
import objetosNegocio.ListaClientes;

public class DAOCliente implements InterfazDAOCliente{

	private DAOConnection connection; //Conexion a BBDD
	
	/**
	 * Constructura clase DAOAlmacenImp
	 * @param connection - Objeto que encapsula la conexion a la bbdd
	 */
	public DAOCliente(DAOConnection connection){
		this.connection = connection;
	}
	
	
	@Override
	public boolean insertarRegistro(Cliente datos) throws SQLException {
		boolean insertado = false;
		Statement stmt = null;
				
		String sentenciaSQL = "";  		//Siempre se inserta el cliente como activo (valor 0)
		sentenciaSQL =	"INSERT INTO gesal.Cliente (idCliente,nombre,apellidos,dni,activo,direccion,poblacion,codPostal,telefono,email,comentarios) VALUES (";
		sentenciaSQL+= "NULL," + "\"" + datos.getNombre() +  "\",\"" + datos.getApellidos() + "\",\""; 
		sentenciaSQL+= datos.getDni() + "\",0,\"" + datos.getDireccion() + "\",\""; 
		sentenciaSQL+= datos.getPoblacion() + "\",\"" + datos.getCodPostal() + "\",\"";
		sentenciaSQL+= datos.getTelefono() + "\",\"" + datos.getEmail() + "\",\"" + datos.getComentarios() + "\")"; 
		
		stmt = connection.getConnection().createStatement();
		if ((stmt.executeUpdate(sentenciaSQL))==1) insertado=true;
		stmt.close();
		
		return insertado;
	}

	@Override
	public boolean modificarRegistro(Cliente datos) throws SQLException {
		boolean modificado = false;
		Statement stmt = null;
		
		int activo = datos.getActivo()? 0 : 1; //Pasamos de boolean a int
		
		String sentenciaSQL = "";
		sentenciaSQL = "UPDATE gesal.Cliente SET";
		sentenciaSQL+= " nombre=\"" + datos.getNombre() + "\",";
		sentenciaSQL+= " apellidos=\"" + datos.getApellidos() + "\",";
		sentenciaSQL+= " dni=\"" + datos.getDni() + "\",";
		sentenciaSQL+= " telefono=\"" + datos.getTelefono() + "\",";
		sentenciaSQL+= " email=\"" + datos.getEmail() + "\",";
		sentenciaSQL+= " direccion=\"" + datos.getDireccion() + "\",";
		sentenciaSQL+= " poblacion=\"" + datos.getPoblacion() + "\",";
		sentenciaSQL+= " codPostal=\"" + datos.getCodPostal() + "\",";
		sentenciaSQL+= " comentarios=\"" + datos.getComentarios() + "\",";
		sentenciaSQL+= " activo=\"" + activo + "\"";
		sentenciaSQL+= " WHERE idCliente=" + datos.getIdCliente();
		
		stmt = connection.getConnection().createStatement();
		if ((stmt.executeUpdate(sentenciaSQL))==1) modificado=true;
		stmt.close();
		
		return modificado;
	}

	@Override
	public boolean bajaRegistro(int codigo) throws SQLException {
		boolean baja = false;
		Statement stmt = null;
		
		String sentenciaSQL = "";
		sentenciaSQL = "UPDATE gesal.Cliente SET activo=1 WHERE idCliente=" + codigo;
		
		stmt = connection.getConnection().createStatement();
		if ((stmt.executeUpdate(sentenciaSQL))==1) baja=true;
		stmt.close();

		return baja;
	}

	@Override
	public Cliente obtenerRegistro(int codigo) throws SQLException {
		ResultSet resul = null;
		Statement stmt = null;
		Cliente datos = null;
		
		String sentenciaSQL = "";
		sentenciaSQL = "SELECT idCliente,nombre,apellidos,dni,activo,direccion,poblacion,codPostal,telefono,email,comentarios";
		sentenciaSQL+= " FROM gesal.Cliente WHERE idCliente=" + codigo;
		
		stmt = connection.getConnection().createStatement();
		resul = stmt.executeQuery(sentenciaSQL);
		
		//Si se encuentra el registro se tratan los datos
		if (resul.next()){  
			datos= new Cliente();	
			datos.setIdCliente(resul.getInt("idCliente"));
			datos.setNombre(resul.getString("nombre"));
			datos.setApellidos(resul.getString("apellidos"));
			datos.setDni(resul.getString("dni"));
			datos.setActivo((resul.getInt("activo")==0));
			datos.setDireccion(resul.getString("direccion"));
			datos.setPoblacion(resul.getString("poblacion"));
			datos.setCodPostal(resul.getString("codPostal"));
			datos.setTelefono(resul.getString("telefono"));
			datos.setEmail(resul.getString("email"));
			datos.setComentarios(resul.getString("comentarios"));
		}
		
		resul.close();
		stmt.close();
	
		return datos;
	}

	@Override
	public ListaClientes obtenerListaRegistros() throws SQLException {
		return obtenerListado(false);
	}
	
	@Override
	public ListaClientes obtenerListaRegistrosActivos() throws SQLException {
		return obtenerListado(true);
	}
	
	
	private ListaClientes obtenerListado(boolean soloActivos) throws SQLException {
		ResultSet resul = null;
		Statement stmt = null;
		
		Cliente datos = null;
		ListaClientes listado = new ListaClientes();
		
		String sentenciaSQL = "";
		sentenciaSQL = "SELECT idCliente,nombre,apellidos,dni,activo,direccion,poblacion,codPostal,telefono,email,comentarios FROM gesal.Cliente";
		
		if (soloActivos)
			sentenciaSQL+= " WHERE activo=0";
		
		stmt = connection.getConnection().createStatement();
		resul = stmt.executeQuery(sentenciaSQL);
		
		
		//Si se encuentra el registro se tratan los datos
		while (resul.next()){  
			datos= new Cliente();	
			datos.setIdCliente(resul.getInt("idCliente"));
			datos.setNombre(resul.getString("nombre"));
			datos.setApellidos(resul.getString("apellidos"));
			datos.setDni(resul.getString("dni"));
			datos.setActivo((resul.getInt("activo")==0));
			datos.setDireccion(resul.getString("direccion"));
			datos.setPoblacion(resul.getString("poblacion"));
			datos.setCodPostal(resul.getString("codPostal"));
			datos.setTelefono(resul.getString("telefono"));
			datos.setEmail(resul.getString("email"));
			datos.setComentarios(resul.getString("comentarios"));
			listado.add(datos);
		}
		
		resul.close();
		stmt.close();
		return listado;
	}

}
